/**
 * JSONP 请求工具
 * @param {string} url 请求地址
 * @param {object} params 请求参数
 * @param {number} [timeout=10000] 超时时间(毫秒)
 * @returns {Promise}
 */
export function jsonp(url, params, timeout = 10000) {
  return new Promise((resolve, reject) => {
    // 生成唯一回调函数名
    const callbackName = `jsonp_${Date.now()}_${Math.floor(Math.random() * 10000)}`

    // 创建script标签
    const script = document.createElement('script')
    script.type = 'text/javascript'

    // 构建查询字符串
    let queryString = ''
    for (const key in params) {
      if (params.hasOwnProperty(key)) {
        queryString += `&${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`
      }
    }

    // 设置超时
    const timer = setTimeout(() => {
      cleanup()
      reject(new Error('Request timeout'))
    }, timeout)

    // 清理函数
    const cleanup = () => {
      clearTimeout(timer)
      delete window[callbackName]
      if (script.parentNode) {
        script.parentNode.removeChild(script)
      }
    }

    // 设置回调函数
    window[callbackName] = (data) => {
      cleanup()
      resolve(data)
    }

    // 设置错误处理
    script.onerror = () => {
      cleanup()
      reject(new Error('JSONP request failed'))
    }

    // 构建最终URL
    script.src = `${url}${url.includes('?') ? '&' : '?'}${queryString}&callback=${callbackName}`

    // 发起请求
    document.body.appendChild(script)
  })
}
